
#import "APGCDTimer.h"

@interface APGCDTimer ()
@property (nonatomic, strong) dispatch_source_t timer;
@end

@implementation APGCDTimer


- (void)startTimerWithTimeInterval:(NSTimeInterval)timeInterval eventHandler:(void (^)(NSTimeInterval))eventHandler{
    WS(ws);
    __block NSInteger timeout= timeInterval; //倒计时时间
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
    dispatch_source_set_event_handler(_timer, ^{
        timeout--;
        dispatch_async(dispatch_get_main_queue(), ^{
            if (eventHandler) {
                eventHandler(timeout);
            }
        });
        if(timeout<=0){ //倒计时结束，关闭
            if (ws.timer) {
                dispatch_source_cancel(ws.timer);
            }
        }
    });
    dispatch_resume(_timer);
}

- (void)startTimerWithEventHandler:(void (^)(void))eventHandler{
    WS(ws);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
    dispatch_source_set_event_handler(_timer, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (eventHandler) {
                eventHandler();
            }
        });
        if(!eventHandler){
            if (ws.timer) {
                dispatch_source_cancel(ws.timer);
            }
        }
    });
    dispatch_resume(self.timer);
}

- (void)startTimerWithEventHandlerTimeInterval:(NSTimeInterval)timeInterval eventHandler:(void (^)(void))eventHandler{
    WS(ws);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),timeInterval*NSEC_PER_SEC, 0);
    dispatch_source_set_event_handler(_timer, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (eventHandler) {
                eventHandler();
            }
        });
        if(!eventHandler){
            if (ws.timer) {
                dispatch_source_cancel(ws.timer);
            }
        }
    });
    dispatch_resume(self.timer);
}

- (void)stopTimer{
    if (_timer) {
        dispatch_cancel(self.timer);
        _timer = nil;
    }
}

@end
